package client

import (
	"crypto/tls"
	"encoding/base64"
	"encoding/json"
	"fmt"
	"net/http"
	"time"

	"github.com/gorilla/websocket"
	"github.com/wailsapp/wails/v3/pkg/application"
)

// WebSocket 事件通用结构
type LCUEvent struct {
	Data  json.RawMessage `json:"data"`  // 事件内容（JSON 原始数据）
	URI   string          `json:"uri"`   // 事件对应的 API 路径
	Event string          `json:"event"` // 事件类型（Create/Update/Delete）
}

// 订阅切片
var Subscriptions []string

var conn *websocket.Conn

// 建立连接
func NewConnection(app *application.App, options map[string]string) {
	for {
		// 检查进程是否正在运行（英雄联盟）
		if !GetClientIsRunning() {
			// 中断循环
			break
		}
		// 构造 WebSocket 认证头
		riotToken := base64.StdEncoding.EncodeToString([]byte("riot:" + options["--remoting-auth-token"]))
		authHeader := http.Header{}
		authHeader.Set("Authorization", "Basic "+riotToken)

		// 配置 WebSocket 连接（跳过证书验证）
		dialer := websocket.Dialer{
			TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
		}

		// 建立 WebSocket 连接
		wsURL := fmt.Sprintf("wss://127.0.0.1:%s/", options["--app-port"])
		var err error
		conn, _, err = dialer.Dial(wsURL, authHeader)
		if err != nil {
			app.EmitEvent("clientConnection", "Disconnected")
			fmt.Println("WebSocket 连接失败:", err)
			// 重连
			time.Sleep(5 * time.Second)
			continue
		}
		defer conn.Close()

		// 发送订阅事件
		app.EmitEvent("clientConnection", "Connected")
		fmt.Println("成功连接到 LCU WebSocket!")
		subscribe := `[5, "OnJsonApiEvent"]`
		if err := conn.WriteMessage(websocket.TextMessage, []byte(subscribe)); err != nil {
			fmt.Println("订阅消息失败:", err)
			// 重连
			time.Sleep(5 * time.Second)
			continue
		}

		// 监听事件
		for {
			_, message, err := conn.ReadMessage()
			if err != nil {
				fmt.Println("WebSocket error:", err, string(message)) // websocket: RSV1 set, RSV2 set, RSV3 set, bad opcode 4
				break
			}
			app.EmitEvent("clientConnection", string(message))
			// 判断是否为订阅事件 订阅切片：Subscriptions
			// for _, sub := range Subscriptions {
			// 	if strings.Contains(string(message), sub) {
			// 		// 发送订阅事件
			// 		runtime.EventsEmit(ctx, "clientConnection", string(message))
			// 	}
			// }
		}

		// 断开连接
		DestroyConnection()
		// 重连
		time.Sleep(5 * time.Second)
	}
}

// 销毁连接
func DestroyConnection() {
	if conn != nil {
		conn.Close()
		fmt.Println("WebSocket 连接已断开")
	}
}

// 增加订阅
func AddSubscription(uri string) {
	Subscriptions = append(Subscriptions, uri)
}

// 删除订阅
func RemoveSubscription(uri string) {
	for i, sub := range Subscriptions {
		if sub == uri {
			Subscriptions = append(Subscriptions[:i], Subscriptions[i+1:]...)
			break
		}
	}
}
